home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 4: GNU Archives / Linux Cubed Series 4 - GNU Archives.iso / gnu / glibc-1.09 / glibc-1 / glibc-1.09.1 / sysdeps / standalone / __read.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-26  |  2.2 KB  |  86 lines

  1. /* Copyright (C) 1994 Free Software Foundation, Inc.
  2.    Ported to standalone by Joel Sherrill jsherril@redstone-emh2.army.mil,
  3.      On-Line Applications Research Corporation.
  4.  
  5. This file is part of the GNU C Library.
  6.  
  7. The GNU C Library is free software; you can redistribute it and/or
  8. modify it under the terms of the GNU Library General Public License as
  9. published by the Free Software Foundation; either version 2 of the
  10. License, or (at your option) any later version.
  11.  
  12. The GNU C Library is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15. Library General Public License for more details.
  16.  
  17. You should have received a copy of the GNU Library General Public
  18. License along with the GNU C Library; see the file COPYING.LIB.  If
  19. not, write to the Free Software Foundation, Inc., 675 Mass Ave,
  20. Cambridge, MA 02139, USA.  */
  21.  
  22. #include <ansidecl.h>
  23. #include <errno.h>
  24. #include <unistd.h>
  25. #include <stddef.h>
  26.  
  27. #include "filedesc.h"
  28. #include <fcntl.h>
  29. #include <standalone.h>
  30.  
  31. /* Read NBYTES into BUF from FD.  Return the number read or -1.  */
  32. ssize_t
  33. DEFUN(__read, (fd, buf, nbytes),
  34.       int fd AND PTR buf AND size_t nbytes)
  35. {
  36.   char *buffer = (char *) buf;
  37.   int data;
  38.   int poll;
  39.  
  40.   errno = 0;
  41.  
  42.   if (nbytes == 0)
  43.     return 0;
  44.  
  45.   if ( !__FD_Is_valid( fd ) || !__FD_Table[ fd ].in_use )
  46.     {
  47.       errno = EBADF;
  48.       return -1;
  49.     }
  50.   if (buf == NULL)
  51.     {
  52.       errno = EINVAL;
  53.       return -1;
  54.     }
  55.  
  56.   if ( __FD_Table[ fd ].flags & O_WRONLY )  /* is it write only? */
  57.     {
  58.       errno = EBADF;
  59.       return -1;
  60.     }
  61.  
  62.   /* If this is a non-blocking fd, then we want to poll the console.  */
  63.  
  64.   poll = ( __FD_Table[ fd ].flags & O_NONBLOCK ) ? 1 : 0;
  65.  
  66.   /* Read a single character.  This is a cheap way to insure that the 
  67.      upper layers get every character because _Console_Getc can't timeout 
  68.      or otherwise know when to stop.  */
  69.  
  70.   
  71.   data = _Console_Getc(poll);
  72.  
  73.   if ( data == -1 )                 /* if no data return */
  74.     return -1;
  75.  
  76.   (void) _Console_Putc(data);       /* echo the character */
  77.  
  78.   if ( data == '\r' ) {        /* translate CR -> CR/LF */
  79.     (void) _Console_Putc('\n');
  80.     data = '\n';
  81.   }
  82.  
  83.   *buffer = data;
  84.   return 1;
  85. }
  86.